/*
 * UserTank.cpp
 *
 *  Created on: Nov 11, 2011
 *      Author: gonzalo
 */

#include "UsersTanks.h"

UsersTanks::UsersTanks(std::string owner,SDLEngine* engine) {
	this->owner = owner;
	this->engine= engine;

}

void UsersTanks::handleUserMessage(DTOCliente *cliente){
	//Segun el estado tomo decision
	switch (cliente->getStatus()) {
		case CONNECTED:
				handleConnect(cliente);
			break;
		case REFRESH:
				handleRefresh(cliente);
			break;
		case DISCONECTED:
				handleDisconnect(cliente);
			break;
	}

}

void UsersTanks::handleDisconnect(DTOCliente* removeClient){
	//Lo agrego al scenario
	//validar que no exista ya
	Tank* oldTank = getTank(removeClient->getClientId());
	if (oldTank != NULL) {
		this->tanks.remove(oldTank);
		//eliminar de la pantalla
		engine->removeTank(oldTank);
	}else{
		Logger::log("UserTanks","handleDisconnect","ERROR: Intento hacer un disconnect sobre un tanque que no existe");
	}

}


void UsersTanks::handleRefresh(DTOCliente* updateClient){
	//Lo agrego al scenario
	//validar que no exista ya
	Tank* oldTank = getTank(updateClient->getClientId());
	if (oldTank != NULL) {
		oldTank->updateStatus(updateClient);
	}else{
		//Si llego aca es que no lo tengo, lo agrego
		handleConnect(updateClient);
	}

}

void UsersTanks::handleConnect(DTOCliente* nuevoCliente){

	bool esLocal = (nuevoCliente->getClientId() == this->owner);

	//Lo agrego al scenario
	//validar que no exista ya
	Tank* oldTank = getTank(nuevoCliente->getClientId());
	if (oldTank == NULL) {
		//Lo agrego
		Tank* tank= engine->addTank(nuevoCliente->getPosX(),
				nuevoCliente->getPosY(),
				nuevoCliente->getClientId(),
				nuevoCliente->getAngle(),esLocal);

		//Lo agrego a la lista de tanques
		this->tanks.push_back(tank);
	}else{
		if (esLocal) {
			oldTank->updateFlag();
		}

		//Por las dudas le hago un update
		handleRefresh(nuevoCliente);
	}


}

Tank* UsersTanks::getTank(std::string owner) {
	std::list<Tank*>::iterator it_tank;

	Tank* tanqueLista = NULL;
	std::list<Tank*>::iterator it_jugador;
	for (it_tank = tanks.begin(); it_tank != tanks.end(); ++it_tank) {
		tanqueLista = ((Tank*) *it_tank);
		if (tanqueLista->getOwner() == owner)
			return tanqueLista;
	}

	return NULL;
}

DTO* UsersTanks::getLocalTankDTO(std::string clienteId){
	TankStatus tankStatus = getTank(clienteId)->getTankStatus();

	return new DTOCliente(clienteId,clienteId,REFRESH,tankStatus.getPosX(),tankStatus.getPosY(),tankStatus.getAngle());
}

UsersTanks::~UsersTanks() {}

